home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / getusershell.c,v < prev    next >
Text File  |  1989-05-18  |  3KB  |  165 lines

  1. head     1.3;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.3
  10. date     89.05.18.17.12.03;  author rab;  state Exp;
  11. branches ;
  12. next     1.2;
  13.  
  14. 1.2
  15. date     88.07.25.10.45.56;  author ouster;  state Exp;
  16. branches ;
  17. next     1.1;
  18.  
  19. 1.1
  20. date     88.07.22.08.34.41;  author ouster;  state Exp;
  21. branches ;
  22. next     ;
  23.  
  24.  
  25. desc
  26. @@
  27.  
  28.  
  29. 1.3
  30. log
  31. @Added forward declarations for static functions.
  32. @
  33. text
  34. @/*
  35.  * Copyright (c) 1985 Regents of the University of California.
  36.  * All rights reserved.  The Berkeley software License Agreement
  37.  * specifies the terms and conditions for redistribution.
  38.  */
  39.  
  40. #if defined(LIBC_SCCS) && !defined(lint)
  41. static char sccsid[] = "@@(#)getusershell.c    5.4 (Berkeley) 7/25/86";
  42. #endif LIBC_SCCS and not lint
  43.  
  44. #include <sys/param.h>
  45. #include <sys/file.h>
  46. #include <sys/stat.h>
  47. #include <ctype.h>
  48. #include <stdio.h>
  49. #include <stdlib.h>
  50.  
  51. #define SHELLS "/etc/shells"
  52.  
  53. static char **initshells();
  54.  
  55. /*
  56.  * Do not add local shells here.  They should be added in /etc/shells
  57.  */
  58. static char *okshells[] =
  59.     { "/bin/sh", "/bin/csh", 0 };
  60.  
  61. static char **shells, *strings;
  62. static char **curshell = NULL;
  63. extern char **initshells();
  64.  
  65. /*
  66.  * Get a list of shells from SHELLS, if it exists.
  67.  */
  68. char *
  69. getusershell()
  70. {
  71.     char *ret;
  72.  
  73.     if (curshell == NULL)
  74.         curshell = initshells();
  75.     ret = *curshell;
  76.     if (ret != NULL)
  77.         curshell++;
  78.     return (ret);
  79. }
  80.  
  81. endusershell()
  82. {
  83.     
  84.     if (shells != NULL)
  85.         free((char *)shells);
  86.     shells = NULL;
  87.     if (strings != NULL)
  88.         free(strings);
  89.     strings = NULL;
  90.     curshell = NULL;
  91. }
  92.  
  93. setusershell()
  94. {
  95.  
  96.     curshell = initshells();
  97. }
  98.  
  99. static char **
  100. initshells()
  101. {
  102.     register char **sp, *cp;
  103.     register FILE *fp;
  104.     struct stat statb;
  105.     extern char *malloc(), *calloc();
  106.  
  107.     if (shells != NULL)
  108.         free((char *)shells);
  109.     shells = NULL;
  110.     if (strings != NULL)
  111.         free(strings);
  112.     strings = NULL;
  113.     if ((fp = fopen(SHELLS, "r")) == (FILE *)0)
  114.         return(okshells);
  115.     if (fstat(fileno(fp), &statb) == -1) {
  116.         (void)fclose(fp);
  117.         return(okshells);
  118.     }
  119.     if ((strings = malloc((unsigned)statb.st_size)) == NULL) {
  120.         (void)fclose(fp);
  121.         return(okshells);
  122.     }
  123.     shells = (char **)calloc((unsigned)statb.st_size / 3, sizeof (char *));
  124.     if (shells == NULL) {
  125.         (void)fclose(fp);
  126.         free(strings);
  127.         strings = NULL;
  128.         return(okshells);
  129.     }
  130.     sp = shells;
  131.     cp = strings;
  132.     while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
  133.         while (*cp != '#' && *cp != '/' && *cp != '\0')
  134.             cp++;
  135.         if (*cp == '#' || *cp == '\0')
  136.             continue;
  137.         *sp++ = cp;
  138.         while (!isspace(*cp) && *cp != '#' && *cp != '\0')
  139.             cp++;
  140.         *cp++ = '\0';
  141.     }
  142.     *sp = (char *)0;
  143.     (void)fclose(fp);
  144.     return (shells);
  145. }
  146. @
  147.  
  148.  
  149. 1.2
  150. log
  151. @Lint.
  152. @
  153. text
  154. @d19 2
  155. @
  156.  
  157.  
  158. 1.1
  159. log
  160. @Initial revision
  161. @
  162. text
  163. @d16 1
  164. @
  165.